#pragma once

#include "common.hpp"

const int defaultfd = -1;

class NamedPipe
{
public:
    NamedPipe(const std::string name) : _name(name), _fd(defaultfd)
    {
    }

    // 创建管道
    bool Create()
    {
        int n = mkfifo(fifoname.c_str(), mode);
        if (n == 0)
        {
            std::cout << "mkfifo suceessful" << std::endl;
        }
        else
        {
            // std::cout << "mkfifo failed" << std::endl;
            perror("mkfifo");
            return false;
        }
        return true;
    }

    bool OpenForRead()
    {
        _fd = open(fifoname.c_str(), O_RDONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        std::cout << "open file success" << std::endl;
        return true;
    }

    bool OpenForWrite()
    {
        _fd = open(fifoname.c_str(), O_WRONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        return true;
    }

    // 输出型参数
    bool Read(std::string *out)
    {
        char buffer[SIZE] = {0};
        ssize_t num = read(_fd, buffer, sizeof(buffer) - 1);
        if (num > 0) // read失败返回-1
        {
            buffer[num] = 0; // 保持C风格字符串，末尾加0
            *out = buffer;
        }
        else if (num == 0)
        {
            return false;
        }
        else
        {
            return false;
        }
        std::cout << "num: " << num << std::endl;
        return true;
    }

    // 输入型参数
    void Write(const std::string &in)
    {
        write(_fd, in.c_str(), in.size());
    }

    // 关闭管道（归还资源）
    void Close()
    {
        if (_fd == defaultfd)
        {
            return; // 直接return,避免执行无效操作
        }
        int n = close(_fd);
        if (n < 0)
            perror("close");
        _fd = -1;

        int m = unlink(_name.c_str());
        (void)m;
    }

    ~NamedPipe()
    {
    }

private:
    std::string _name; // 管道文件名
    int _fd;           // 管道文件描述符
};